import axios from 'axios';
import { ElMessage } from 'element-plus';
import router from '@/router';

// 创建axios实例
const http = axios.create({
  baseURL: '/api', // 修改为相对路径，通过Vite代理访问
  timeout: 10000, // 请求超时时间
  headers: {
    'Content-Type': 'application/json'
  },
  // 允许跨域请求携带cookie
  withCredentials: true
});

// 请求拦截器
http.interceptors.request.use(
  config => {
    // 从localStorage获取token
    const token = localStorage.getItem('token');
    if (token) {
      // 如果存在token，则在请求头中添加Authorization字段
      config.headers['Authorization'] = token;
      
      // 输出请求头信息，帮助调试
      console.log('Request with token:', token);
    }
    return config;
  },
  error => {
    // 请求错误处理
    console.error('Request error: ', error);
    return Promise.reject(error);
  }
);

// 响应拦截器
http.interceptors.response.use(
  response => {
    // 返回原始响应数据，不再处理headers
    return {
      status: response.status,
      statusText: response.statusText,
      headers: response.headers,
      data: response.data, // 包含 {code, msg, data} 格式的响应
      originalResponse: response
    };
  },
  error => {
    // 请求错误处理
    if (error.response) {
      // 服务器返回了错误状态码
      const status = error.response.status;
      const errorMsg = error.response.data?.message || '请求错误';
      
      switch (status) {
        case 401:
          // 未授权，清除token并跳转到登录页
          localStorage.removeItem('token');
          ElMessage.error('登录已过期，请重新登录');
          router.push('/');
          break;
        case 403:
          // 权限不足
          ElMessage.error('无权限访问');
          router.push('/error/403');
          break;
        case 404:
          // 资源不存在
          ElMessage.error('请求的资源不存在');
          router.push('/404');
          break;
        case 500:
          // 服务器错误
          ElMessage.error('服务器错误');
          router.push('/500');
          break;
        default:
          ElMessage.error(errorMsg);
          if (status >= 500) {
            router.push(`/error/${status}`);
          }
      }
    } else if (error.request) {
      // 请求已发送但没有收到响应
      ElMessage.error('服务器无响应，请检查您的网络连接');
      router.push('/error/503');
    } else {
      // 请求配置错误
      ElMessage.error('请求配置错误');
    }
    return Promise.reject(error);
  }
);

export default http; 